const log = require("../utils/log.js");

var proto_man = {
    PROTO_JSON: 1,
    PROTO_BUF: 2,
    encode_cmd: encode_cmd,
    decode_cmd: decode_cmd,
    reg_decoder: reg_buf_decoder,
    reg_encoder: reg_buf_encoder,
};

// 加密
function encrypt_cmd(str_or_buf) {
    // 加密算法
    return str_or_buf;
}

// 解密
function decrypt_cmd(str_or_buf) {
    return str_or_buf;
}

function _json_encode(stype, ctype, body) {
    var cmd = {};
    cmd[0] = stype;
    cmd[1] = ctype;
    cmd[2] = body;

    var str = JSON.stringify(cmd);
    return encrypt_cmd(str);
}

function _json_decode(cmd_json) {
    var cmd;
    try {
        cmd = JSON.parse(cmd_json);
    } catch (error) {
        
    }
    if (!cmd || 
        typeof (cmd[0]) == "undefined" ||
        typeof (cmd[1]) == "undefined" ||
        typeof (cmd[2]) == "undefined") {
        return null;
    }
    return cmd;
}

// 参数1:协议类型json， buf协议；参数2：服务类型；参数3：命令号
function encode_cmd(proto_type, stype, ctype, body) {
    if (proto_type == proto_man.PROTO_JSON) {
        buf = _json_encode(stype, ctype, body);
    } else {
        // buf协议
        var key = get_key(stype, ctype);
        if (!encoders[key]) {
            return null;
        }
        var buf = encoders[key](body);
    }
    if (buf) {
        buf = encrypt_cmd(buf);     // 加密
    }
    return buf;
}

// 参数1：协议类型；参数2：接到的数据命令
// 返回：{0:stype, 1:ctype, 2:body}
function decode_cmd(proto_type, str_or_buf) {
    str_or_buf = decrypt_cmd(str_or_buf);   // 解密
    if (proto_type == proto_man.PROTO_JSON) {
        return _json_decode(str_or_buf);
    }
    if (str_or_buf.length < 4) {
        return null;
    }
    var cmd = null;
    var stype = str_or_buf.readInt16LE(0);
    var ctype = str_or_buf.readInt16LE(2);
    var key = get_key(stype, ctype);
    if (!decoders[key]) {
        return null;
    }
    cmd = decoders[key](str_or_buf);
    return cmd;
}

// buf协议的编码/解码管理，stype，ctype --> encode/decode
var decoders = {};  // 保存当前buf协议的所有解码函数
var encoders = {};

function get_key(stype, ctype) {
    return (stype * 65536 + ctype);
}

// encode_func(body) return 二进制buffer对象
function reg_buf_encoder(stype, ctype, encode_func) {
    var key = get_key(stype, ctype);
    if (encoders[key]) {    // 已经注册过了
        log.warn("stype: " + stype + " ctype: " + ctype + " is register")
    }
    encoders[key] = encode_func;
}

// decode_func(cmd_buf) return cmd{0:服务号, 1:命令号, 2:body}
function reg_buf_decoder(stype, ctype, decode_func) {
    var key = get_key(stype, ctype);
    if (decoders[key]) {    // 已经注册过了
        log.warn("stype: " + stype + " ctype: " + ctype + " is register")
    }
    decoders[key] = decode_func;
}
// end

module.exports = proto_man;
